package com.kantboot.global.exception;

import com.kantboot.global.exception.item.*;
import com.kantboot.util.common.exception.BaseException;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 全局异常处理
 */
public class GlobalException {

    /**
     * Auth模块的异常
     */
    public static final class auth extends AuthException {}

    /**
     * 系统管理员异常
     */
    public static final class sysAdmin extends SysAdminException {}

    /**
     * 系统设置异常
     */
    public static final class sysSetting extends SystemSettingException {}

    /**
     * 用户账号异常
     */
    public static final class userAccount extends UserAccountException {}

    /**
     * 文件功能的异常
     */
    public static final class functionalFile extends FunctionalFileException {}

    /**
     * 邮件功能的异常
     */
    public static final class functionalEmail extends FunctionalEmailException {}

    /**
     * 短信功能的异常
     */
    public static final class functionalSms extends FunctionalSmsException {}

    /**
     * 验证码模块的异常
     */
    public static final class functionalVerificationCode extends FunctionalVerificationCodeException {}

    /**
     * 七牛云模块的异常
     */
    public static final class apiQiniuCloud extends ApiQiniuCloudException {}

    /**
     * 去除所有BaseException的实例化
     */
    public static List<BaseException> getBaseExceptionList() {
        // 获取GlobalException类中的所有内部类，即各个模块所有静态的的BaseException常量
        Class<?>[] classes = GlobalException.class.getDeclaredClasses();

        // 用于存放所有BaseException的实例化
        List<BaseException> baseExceptionList = new ArrayList<>();
        for (Class<?> aClass : classes) {
            Field[] declaredFields = aClass.getFields();
            for (Field declaredField : declaredFields) {
                // 如果是BaseException类型的字段
                if (BaseException.class.isAssignableFrom(declaredField.getType())) {
                    try {
                        // 实例化BaseException
                        BaseException baseException = (BaseException) declaredField.get(null);
                        baseExceptionList.add(baseException);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return baseExceptionList;
    }

}
